#pragma once
#include <iostream>
#include <functional>
#include <string>
#include <cstring>
#include <cerrno>
#include <cassert>

namespace zxf
{
    class Thread
    {
        // typedef void* (*func_t)(void*); //C语言的方法
        typedef std::function<void *(void *)> func_t; // c++的方法
        // using func_t = std::function<void*(void*)>;
    private:

        //线程支持的函数 
        static void *start_fun(void *args)
        {
            Thread *pt = static_cast<Thread *>(args);
            return pt->_func(pt->_args);
            // 也可以在封装一下 ，让在类外面也可也调用这个函数。
        }

    public:
        ////初始化
        Thread()
        {
            char name[128];
            snprintf(name, 64, "thread-%d", _number++);
            _name = name;
        }

        void start(func_t func, void *args = nullptr)
        {
            _func = func;
            _args = args;
            int ret = pthread_create(&tid, nullptr, start_fun, (void *)this);
            assert(ret == 0);
            (void)ret;
        }
        
        void join()
        {
            int ret = pthread_join(tid, nullptr);
            assert(ret == 0);
            (void)ret;
        }

        std::string getname()
        {
            return _name;
        }
        ~Thread()
        {
            // no
        }

    //private:
        pthread_t tid;
        func_t _func;       // 线程执行函数
        void *_args;        // 线程执行函数的参数
        std::string _name;  // 线程的名字
        static int _number; // 线程编号。//自增长
    };

    int Thread::_number = 1;
    // 静态的成员变量，需要在类外面定义。

} // thread namespace zxf end